package main

import (
	"encoding/json"
	"fmt"
)

// 结构体字段的可见性和JSON序列化

// go 语言首字母大写的可以被外部调用, 首字母小写只能在本包里面使用

type student struct {
	ID   int
	Name string
}

// student 的构造函数
func newStudent(id int, name string) student {
	return student{
		ID:   id,
		Name: name,
	}
}

// 引入 tag 可以使用tag的传值,格式 `key:"value" key1:"value1"`
type class struct {
	Title    string    `json:"title"`
	Students []student `json:"student_list"`
}

type class01 struct {
	title    string
	Students []student
}

func main() {
	// struct 嵌套使用
	c1 := class{Title: "高三17", Students: make([]student, 0, 20)}
	for i := 1; i <= 10; i++ {
		tmpStu := newStudent(i, fmt.Sprintf("stu%02d", i))
		c1.Students = append(c1.Students, tmpStu)
	}
	fmt.Printf("%#v", c1)
	// Json 序列化 Go的结构 => JSON 格式字符串
	fmt.Println("Go Json Marshal === >> ")
	data, err := json.Marshal(c1)
	if err != nil {
		fmt.Println("json marshal error is ", err)
		return
	}
	fmt.Printf("1111111,%T\n", data)
	fmt.Printf("%s\n", data)

	// Json 反序列化 Json字符串 => Go 语言中的数据
	Jsonstr := `{"title": "高三17","student_list": [{"ID": 1,"Name": "stu01"},{"ID": 2,"Name": "stu02"},{"ID": 3,"Name": "stu03"}]}`
	var c2 class
	err = json.Unmarshal([]byte(Jsonstr), &c2)
	if err != nil {
		fmt.Println("Unmarshal error ", err)
	}
	fmt.Printf("2222 ,%T\n", c2)
	fmt.Printf("%#v", c2)

	// 结构体小写 不可访问
	var c3 class01
	err = json.Unmarshal([]byte(Jsonstr), &c3)
	if err != nil {
		fmt.Println("Unmarshal error ", err)
	}
	fmt.Printf("\n\n\n")
	fmt.Printf("33333 ,%T\n", c3)
	fmt.Printf("%#v", c3)

}
